#pragma once
#include "Page.h"
#include "typedef.h"
namespace MircoUi{
    // 添加跟随类型枚举
    namespace eFollowType {
        enum  {
            R = 0,  // 在其右侧
            B = 1  // 在其下方
        };
    }
    namespace eUpdateType {
        enum  {
            no_change = 0,//不更新，除非有变化
            changed = 1, //更新，然后回到 no_change
        };
    }
    class LayoutPage;

    class vItem{
    private:
        vItem* follower_list_next;//用于构成链表。
        vItem* update_list_next;
        vItem* follower;//跟随者
        LayoutPage* root_page; //根页面
        sVec2 abs_point;//本项目的绝对位置
        sVec2 size;
    protected:
        sVec2 diff;//相对起始点的位置
    private:
        uint8 update_flag;
    public:
        uint8 h;//字符高度      
        uint8 follow_type;//跟随类型，0:在其右侧，1:在其下方
        uint8 mode; //模式，0:正常，1:反色
    private:    
        void follow(vItem* sub_item);
        void initUi(LayoutPage* root,sVec2 diff, uint8 h, uint8 follow_type);
    public:
        void changed() ;
    public:            
        //在频幕上绘制此Item，返回绘图的实际尺寸
        virtual sVec2 draw(sVec2 ap)=0;     
        void initUi(LayoutPage* root,vItem* followee,int16 x, int16 y, uint8 h,uint8 follow_type);        
        void initUi(LayoutPage* root,int16 x, int16 y, uint8 h,uint8 follow_type);
        friend class LayoutPage; 
    };   
    

    class LayoutPage: public Page {
    private:
        vItem* follower_list; //根节点
        vItem* update_list;
    public:
        tEvent eventCB; // 页面事件回调函数，页面可以接收事件，例如按键
    private:  
        uint8 status;//页面状态，0:未绘制，1:已绘制
    private:        
        void drawItem(vItem* item);
        static int foreachDraw(void* node, void* tag);
    public:
        LayoutPage() : follower_list(nullptr), update_list(nullptr), status(0) {}
        virtual void refresh();
        virtual void onEvent(uint32 event_id, uint32 event_par);
        void init();
        //在屏幕上绘制页面
        friend class vItem; // 允许vItem访问私有成员
    };
}

